/*
 * colas.c
 *
 *  Created on: 01/12/2011
 *      Author: utn_so
 */

#include "../../headers/GlobalHeader.h"

extern t_Cola *colaPedidos;

t_Cola *crearCola()
{
	int32_t rc;
	colaPedidos = malloc(sizeof(t_Cola));
	colaPedidos->frente = NULL;
	colaPedidos->fin = NULL;

	rc = sem_init(&colaPedidos->cantidadPedidos, 0, 0);
	if (rc == -1)
	{
		free(colaPedidos);
		return NULL;
	}

	return colaPedidos;
}

void agregarPedido_cola(t_pedido pedidoNuevo)
{
	t_nodoCola *nuevoNodo = malloc(sizeof(t_nodoCola));
	nuevoNodo->pedido = pedidoNuevo;
	nuevoNodo->siguiente = NULL;

	if (colaPedidos->frente == NULL)
	{
		colaPedidos->frente = nuevoNodo;
	}
	else
	{
		colaPedidos->fin->siguiente = nuevoNodo;
	}

	colaPedidos->fin = nuevoNodo;

	sem_post(&(colaPedidos->cantidadPedidos));
}

t_pedido quitarPedido_cola()
{
	t_pedido pedidoElegido;
	float mejorTiempo, tiempoEvaluo;
	t_nodoCola *aux, *nodoBorro, *anterior, *anteriorBorro;

	mejorTiempo = 9999999999;
	aux = colaPedidos->frente;
	nodoBorro = aux;
	anterior = NULL;
	anteriorBorro = NULL;

	sem_wait(&colaPedidos->cantidadPedidos);

	while(aux != NULL)
	{
		PPD_CHS sectorEvaluo = ppd_LBAToCHS(aux->pedido.direccionSector);
		tiempoEvaluo = tiempoEntreSectores(posicionActualCabezal, sectorEvaluo);

		if (tiempoEvaluo < mejorTiempo)
		{
			mejorTiempo = tiempoEvaluo;
			pedidoElegido = aux->pedido;
			nodoBorro = aux;
			anteriorBorro = anterior;
		}
		//ME ASEGURO QUE HAYA MAS NODOS EN LA COLA, MUEVO EL ANTERIOR Y MUEVO EL AUXILIAR
		if(aux->siguiente != NULL)
		{
			anterior = aux;
			aux = aux->siguiente;
		}
		else//NO HAY MAS NODOS EN LA COLA, AUX ESTA APUNTANDO AL ULTIMO NODO
		{
			aux = NULL;
		}

	}

	if (anteriorBorro != NULL)
	{
		anteriorBorro->siguiente = nodoBorro->siguiente;
	}
	else //ESTOY BORRANDO EL PRIMER NODO DE LA COLA
	{
		colaPedidos->frente = nodoBorro->siguiente;
	}

	free(nodoBorro);

	return pedidoElegido;
}

void destruirCola()
{
	sem_destroy(&colaPedidos->cantidadPedidos);
	free(colaPedidos);
}

PPD_CHS tomarPedido_cola()
{
	PPD_CHS proximoSector;
	t_pedido pedidoElegido;
	float mejorTiempo, tiempoEvaluo;
	t_nodoCola *aux;

	mejorTiempo = 9999999999;
	aux = colaPedidos->frente;
	proximoSector = ppd_LBAToCHS(-1);

	while(aux != NULL)
	{
		PPD_CHS sectorEvaluo = ppd_LBAToCHS(aux->pedido.direccionSector);
		tiempoEvaluo = tiempoEntreSectores(posicionActualCabezal, sectorEvaluo);

		if (tiempoEvaluo < mejorTiempo)
		{
			pedidoElegido = aux->pedido;
			proximoSector = ppd_LBAToCHS(pedidoElegido.direccionSector);
			mejorTiempo = tiempoEvaluo;
		}
		if(aux->siguiente != NULL)
		{
			aux = aux->siguiente;
		}
		else//NO HAY MAS NODOS EN LA COLA, AUX ESTA APUNTANDO AL ULTIMO NODO
		{
			aux = NULL;
		}
	}

	return proximoSector;
}
